home *** CD-ROM | disk | FTP | other *** search
- /*************************************************************************************
-
- DSJava.c
- written by Chris Evans & Rick Eames
- (c) 1996 Natural Intelligence, Inc. All Rights Reserved.
-
- This file holds the key to life for using Java in your applications.
-
- Questions for Chris
-
- *************************************************************************************/
-
- #include "RoasterVM.h"
- #include "JavaRuntime.h"
- #include <ctype.h>
- #include <stdio.h>
- #include <string.h>
- #include "UnixPaths.h"
- #include "DSUtils.h"
-
- /*************************************************************************************
- PROTOTYPES
- *************************************************************************************/
-
- static Handle GetFullPathName(FSSpec *inFileSpec);
- static Boolean abortKeyPressed(void);
- static Boolean ErrorWithFileNameAndLineNumber(char *str,long len);
- static JavaStatus mac_tools_CompilerExceptionStream_writeBytes(JavaEnv env,
- JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
- static JavaStatus mac_tools_CompilerErrorStream_writeBytes(JavaEnv env,
- JavaRef thisRef, JavaRef arrayRef, JavaInt off, JavaInt len);
- static JavaStatus mac_tools_CompilerErrorStream_writeBytes_stub(JavaEnv env);
- static JavaStatus mac_tools_CompilerExceptionStream_writeBytes_stub(JavaEnv env);
- OSErr Java_ProcessFile(FSSpec *inFSSpec);
- short BuildClassPathStringHandle(Handle classPath,JavaRuntime runtime, FSSpec *inFSSpec);
-
- /*************************************************************************************
-
- abortKeyPressed
-
- Was the command-period pressed during our operation?
-
- *************************************************************************************/
-
- static Boolean
- abortKeyPressed(void)
- {
- KeyMap theKeys;
- UInt8 *km = (UInt8 *) theKeys;
- # define KEYDOWN(k) (((km[k>>3] >> (k & 7)) & 1) != 0)
- GetKeys(theKeys);
- return (KEYDOWN(0x37) && KEYDOWN(0x2F));
- # undef KEYDOWN
- }
-
- /*************************************************************************************
-
- GetFullPathName
-
- Given an FSSpec, return a full pathname in a Handle.
-
- *************************************************************************************/
-
- static Handle
- GetFullPathName(
- FSSpec *inFileSpec)
- {
- Str255 theStr;
- CInfoPBRec pb;
- Handle theString;
- char sep = '/';
-
- if ((theString = NewHandle(0)) == NULL)
- return NULL;
- BlockMoveData(inFileSpec->name,
- theStr, inFileSpec->name[0]+1);
- Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
- pb.hFileInfo.ioNamePtr = theStr;
- pb.hFileInfo.ioVRefNum = inFileSpec->vRefNum;
- pb.hFileInfo.ioCompletion = NULL;
- pb.hFileInfo.ioFDirIndex = -1;
- pb.dirInfo.ioDrDirID = inFileSpec->parID;
- while (TRUE) {
- if (PBGetCatInfoSync( &pb ))
- break;
- Munger(theString, 0, 0, 0, &sep, 1);
- Munger(theString, 0, 0, 0, &theStr[1], theStr[0]);
- pb.dirInfo.ioDrDirID = pb.dirInfo.ioDrParID;
- pb.hFileInfo.ioFDirIndex = -1;
- }
- Munger(theString, 0, 0, 0, &sep, 1);
- return theString;
- }
-
-
- /*************************************************************************************
-
- ErrorWithFileNameAndLineNumber
-
-
- *************************************************************************************/
-
- static Boolean
- ErrorWithFileNameAndLineNumber(
- char *str,
- long len)
- {
- char *bytes = str;
-
- while (*bytes != ':' && len)
- {
- bytes += 1;
- len -= 1;
- }
- if (len && *bytes == ':')
- {
- bytes += 1;
- len -= 1;
- if (*bytes >= '0' && *bytes <= '9')
- {
- bytes += 1;
- len -= 1;
- while (*bytes != ':' && len)
- {
- bytes += 1;
- len -= 1;
- }
- return (len && *bytes == ':');
- }
- }
- return false;
- }
-
- /*************************************************************************************
-
- mac_tools_CompilerExceptionStream_writeBytes
-
- *************************************************************************************/
-
- static JavaStatus
- mac_tools_CompilerExceptionStream_writeBytes(
- JavaEnv env,
- JavaRef thisRef,
- JavaRef arrayRef,
- JavaInt off,
- JavaInt len)
- {
- char *bytes;
- FSSpec theSpec, appSpec;
- short fRefNum;
- OSErr theErr;
- JavaStatus err;
-
-
- GetAppFSSpec(&appSpec);
-
- err = JavaArray_baseAddr(env, arrayRef, &bytes);
- if (err != JavaStatusOk)
- {
- return err;
- }
- bytes += off;
-
- theErr = UnixParsePath("javac_error.log",
- appSpec.vRefNum, appSpec.parID, false, false, true, true, 'Rstr', 'TEXT', "\p", NULL, &theSpec);
- theErr = FSpOpenDF(&theSpec, fsWrPerm, &fRefNum);
- if (theErr == noErr)
- {
- SetFPos(fRefNum, fsFromLEOF, 0);
- FSWrite(fRefNum, &len, bytes);
- }
- FSClose(fRefNum);
- return JavaStatusOk;
- }
-
- /*************************************************************************************
-
- mac_tools_CompilerErrorStream_writeBytes
-
- *************************************************************************************/
-
- static JavaStatus
- mac_tools_CompilerErrorStream_writeBytes(
- JavaEnv env,
- JavaRef thisRef,
- JavaRef arrayRef,
- JavaInt off,
- JavaInt len)
- {
- #if 1
- FSSpec theSpec = { 0, 0, "\p" }, appSpec;
- long lineNum = 0;
- char *bytes;
- JavaStatus err;
- Boolean warning = false;
- static char err_buffer[2000];
- Boolean cancelNow;
- static unsigned long nextMessageTicks = 0;
-
- GetAppFSSpec(&appSpec);
-
- err = JavaArray_baseAddr(env, arrayRef, &bytes);
- if (err != JavaStatusOk)
- {
- return err;
- }
- bytes += off;
- len = (sizeof(err_buffer) < len) ? sizeof(err_buffer) - 1 : len;
- if (*bytes == ' ' || *bytes == '\t' || *bytes == '^')
- {
- return JavaStatusOk;
- }
-
- if (*bytes == '[')
- {
- strncpy(err_buffer, bytes + 1, len - 3);
- err_buffer[len - 3] = '\0';
- printf("%s\n",err_buffer);
- cancelNow = abortKeyPressed();
- if(cancelNow) {
- return JavaStatusExceptionThrown;
- }
-
- return JavaStatusOk;
- }
- else if (ErrorWithFileNameAndLineNumber(bytes, len))
- {
- long i = 0;
- while (*bytes != ':' && len)
- {
- err_buffer[i++] = *bytes++;
- err_buffer[i] = '\0';
- len -= 1;
- }
- if (*bytes == ':')
- {
- OSErr theErr;
- theErr = UnixParsePath(err_buffer, appSpec.vRefNum,
- appSpec.parID, false, false, false, true, 0, 0, "\p", NULL, &theSpec);
- if (theErr == noErr)
- {
- bytes += 1;
- len -= 1;
- i = 0;
- while (*bytes != ':' && len)
- {
- err_buffer[i++] = *bytes++;
- err_buffer[i] = '\0';
- len -= 1;
- }
- if (*bytes == ':')
- {
- lineNum = atoi(err_buffer);
- bytes += 1;
- len -= 1;
-
- if (*bytes == ' ')
- {
- bytes += 1;
- len -= 1;
- }
- if (memcmp(bytes, "Warning: ", 9) == 0)
- {
- bytes += 9;
- len -= 9;
- warning = true;
- }
-
- BlockMoveData(bytes, err_buffer, len);
- err_buffer[len] = '\0';
- }
- else
- {
- return JavaStatusOk;
- }
- }
- }
- else
- {
- return JavaStatusOk;
- }
- }
- else
- {
- BlockMoveData(bytes, err_buffer, len);
- err_buffer[len] = '\0';
- }
- len = strlen(err_buffer);
- if (len && err_buffer[len-1] < ' ') err_buffer[len-1] = '\0';
- if(warning) {
- printf("Warning: %s\n", err_buffer);
- }
- else {
- printf("Error: %s\n", err_buffer);
- }
- #else
- mac_tools_CompilerExceptionStream_writeBytes(env, thisRef, arrayRef, off, len);
- #endif
- return JavaStatusOk;
- }
-
- /*************************************************************************************
-
- mac_tools_CompilerErrorStream_writeBytes_stub
-
- *************************************************************************************/
-
- static JavaStatus
- mac_tools_CompilerErrorStream_writeBytes_stub(
- JavaEnv env)
- {
- JavaStatus err;
- JavaInt _local_3 = JavaEnv_popInt(env);
- JavaInt _local_2 = JavaEnv_popInt(env);
- JavaRef _local_1 = JavaEnv_popRef(env);
- JavaRef _local_0 = JavaEnv_popRef(env);
-
- err = mac_tools_CompilerErrorStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
- return err;
- }
-
- /*************************************************************************************
-
- mac_tools_CompilerExceptionStream_writeBytes_stub
-
- *************************************************************************************/
-
- static JavaStatus
- mac_tools_CompilerExceptionStream_writeBytes_stub(
- JavaEnv env)
- {
- JavaStatus err;
- JavaInt _local_3 = JavaEnv_popInt(env);
- JavaInt _local_2 = JavaEnv_popInt(env);
- JavaRef _local_1 = JavaEnv_popRef(env);
- JavaRef _local_0 = JavaEnv_popRef(env);
-
- err = mac_tools_CompilerExceptionStream_writeBytes(env, _local_0, _local_1, _local_2, _local_3);
- return err;
- }
-
- /*************************************************************************************
-
- BuildClassPathStringHandle
-
- *************************************************************************************/
-
- short
- BuildClassPathStringHandle(
- Handle classPath,
- JavaRuntime runtime,
- FSSpec *inFSSpec)
- {
- Handle curr;
- OSErr err;
- long resultSize;
- FSSpec spec, *specPtr;
- short resultPaths = 0;
-
- specPtr = JavaRuntime_getJavaDirectory(runtime);
- if(specPtr) {
- spec = *specPtr;
- BlockMoveData("\pclasses.zip",&spec.name, 12);
- // pstrcpy((char *)specPtr->name, (char *)"\pclasses.zip");
- curr = GetFullUnixPath(&spec);
- if(curr) {
- err = HandAndHand(curr, classPath);
- PtrAndHand(":", classPath, 1);
- DisposeHandle(curr);
- resultPaths++;
- }
- }
-
- if(inFSSpec) {
- curr = GetFullUnixPathFromDirID(inFSSpec->vRefNum, inFSSpec->parID);
- if(curr) {
- err = HandAndHand(curr, classPath);
- PtrAndHand(":", classPath, 1);
- DisposeHandle(curr);
- resultPaths++;
- }
- }
-
-
- resultSize = GetHandleSize(classPath);
- if(resultSize > 0) {
- (*classPath)[resultSize-1] = 0;
- SetHandleSize(classPath, resultSize - 1); //Get rid of the last :
- }
-
- return resultPaths;
- }
-
- /*************************************************************************************
-
- Java_ProcessFile
-
- *************************************************************************************/
-
- OSErr
- Java_ProcessFile(
- FSSpec *inFSSpec)
- {
- JavaEnv env;
- JavaStatus err;
- JavaRef argRef;
- JavaRef argvRef;
- JavaRef classRef;
- JavaRuntime runtime;
- Handle thePath, classPath;
- short argCount = 4;
- Boolean depends, nowarn, debugInfo, optimize;
-
- thePath = GetFullPathName(inFSSpec);
- if (thePath == NULL)
- {
- err = 15004;
- goto done; // hmmmm....goto....
- }
-
- //////////////////////////////////////////////////////////////////////
- // Get a JavaRuntime instance for use by our droplet.
- //////////////////////////////////////////////////////////////////////
-
- if ((runtime = GetJavaRuntime()) == NULL)
- {
- return 15003;
- }
-
- classPath = NewHandle(0);
- BuildClassPathStringHandle(classPath, runtime, inFSSpec);
-
- //////////////////////////////////////////////////////////////////////
- // tell the Java runtime what kind of file to create
- // and where to create them.
- //////////////////////////////////////////////////////////////////////
-
- JavaRuntime_setOutputFileType(runtime, 'Clss');
- JavaRuntime_setHomeDirectory(runtime, inFSSpec);
-
- //////////////////////////////////////////////////////////////////////
- // ask the runtime to find a java class
- //////////////////////////////////////////////////////////////////////
-
- err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerErrorStream");
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- err = JavaRuntime_setMethod(runtime, classRef,
- "writeBytes", "([BII)V", mac_tools_CompilerErrorStream_writeBytes_stub,
- NULL, JavaAccessMember);
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- err = JavaRuntime_findClass(runtime, &classRef, "mac/tools/CompilerExceptionStream");
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- err = JavaRuntime_setMethod(runtime, classRef,
- "writeBytes", "([BII)V", mac_tools_CompilerExceptionStream_writeBytes_stub,
- NULL, JavaAccessMember);
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- //////////////////////////////////////////////////////////////////////
- // this may look stupid, but really it's not. :-)
- // In Roaster, you set these up via the preferences dialog
- // box. Here, we don't get that fancy. But we have left the
- // code here to show how we deal with those options in interacting
- // with the Java Runtime
- //////////////////////////////////////////////////////////////////////
-
- depends = false;
- nowarn = false;
- debugInfo = true;
- optimize = false;
-
- if (depends) argCount++;
- if (nowarn) argCount++;
- if (debugInfo) argCount++;
- if (optimize) argCount++;
-
- //////////////////////////////////////////////////////////////////////
- //
- //////////////////////////////////////////////////////////////////////
-
- env = JavaEnv_make(runtime, (JavaOSThread) NULL);
- if (env == NULL)
- {
- err = JavaStatusOutOfMemory;
- goto done;
- }
- err = JavaArray_makeUTF(env, &argvRef, "[Ljava/lang/String;", argCount);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaString_makeUTF(env, &argRef, "-verbose", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, 0, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- argCount = 1;
-
- if (depends) // check dependencies
- {
- err = JavaString_makeUTF(env, &argRef, "-depend", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- }
-
- if (nowarn) // show warnings?
- {
- err = JavaString_makeUTF(env, &argRef, "-nowarn", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- }
-
- if (debugInfo) // show debug information
- {
- err = JavaString_makeUTF(env, &argRef, "-g", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- }
-
- if (optimize) // optimize the compile?
- {
- err = JavaString_makeUTF(env, &argRef, "-O", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- }
-
- if (classPath)
- {
- err = JavaString_makeUTF(env, &argRef, "-classpath", -1);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- HLock(classPath);
- err = JavaString_makeUTF(env, &argRef, *classPath, GetHandleSize(classPath));
- DisposeHandle(classPath);
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- }
-
- HLock(thePath);
- err = JavaString_makeUTF(env, &argRef, *thePath, GetHandleSize(thePath));
- DisposeHandle(thePath);
- if (err != JavaStatusOk)
- {
- goto done;
- }
- err = JavaArray_setElement(env, argvRef, argCount++, argRef);
- if (err != JavaStatusOk)
- {
- goto done;
- }
-
- SetCursor(*GetCursor(watchCursor));
-
- err = JavaObject_callStaticUTF(env, NULL, "mac/tools/javac",
- "main", "([Ljava/lang/String;)V", argvRef);
-
- JavaEnv_dispose(env);
-
- JavaRuntime_setOutputFileType(runtime, 'TEXT');
-
-
- InitCursor();
-
- done:
- return err;
-
-
- }